import { PassportStrategy } from '@nestjs/passport';
import { Strategy, ExtractJwt } from 'passport-jwt';
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: process.env.JWT_SECRET || 'ALuXP4g5f9ZLcMrrKZwcH4q95c53Qvey',
    });
  }
  /*
   * JWT 验证 - Step 4: 被守卫调用
   * 这个 validate() 函数会在每个路由守卫执行守卫策略的地方被调用，这个地方就正好是路由守卫 AuthGuard('jwt') 的 jwt.strategy 调用的地方
   * 这个函数执行完毕后会将值返回给 AuthGuard('jwt')，它通常返回的是一个对象，例如 { valid: true }，你喜欢返回什么都可以
   */
  async validate(payload: any, done: (err: Error, user: any) => void) {
    console.log('jwt stratedy: \n' + payload);
    const user = await this.authService.validateUser(payload);
    if (!user) {
      done(new UnauthorizedException(), false);
    }
    done(null, user);
    return user;
  }
}
